﻿using System;
using System.Collections.Generic;
using System.Data;
using Entersoft.Data.DotNetDAL.SQL;

namespace BLL
{
    public class PreDistribuciones: CommonList<PreDistribucion>
    {
        private readonly string mPeriodo;
        private readonly int? mBodegasId;
        private readonly string mPasillo;
        private readonly int mNroToma;

        public PreDistribuciones(string Periodo, int BodegasId, int NroToma): this(Periodo, BodegasId, NroToma, null)
        {
        }

        public PreDistribuciones(string Periodo, int BodegasId, int NroToma, string Pasillo)
        {
            mPeriodo = Periodo;
            mBodegasId = BodegasId;
            mNroToma = NroToma;
            mPasillo = Pasillo;

            ObtenerPreDistribuciones();
        }

        public void ObtenerPreDistribuciones()
        {
            AddRange(ObtenerPreDistribuciones(mPeriodo, mBodegasId, mNroToma, mPasillo, ref mMensaje));
        }

        public new void Add(PreDistribucion item)
        {
            mLista.Add(item);
        }
        
        public void AddRange(IList<PreDistribucion> items)
        {
            foreach (var tmpPredistrbucion in items)
                mLista.Add(tmpPredistrbucion);
        }

        private static IList<PreDistribucion> ObtenerPreDistribuciones(string Periodo, int? BodegasId, int NroToma, string Pasillo, ref string message)
        {
            var retorno = new List<PreDistribucion>();

            var objRP = new Entersoft.Data.DotNetResponse.SQL.Persistence { StoredProcedure = "sp_get_PreDistribucion" };

            objRP.AddParametro(Periodo);
            objRP.AddParametro(BodegasId);
            objRP.AddParametro(NroToma);
            objRP.AddParametro(Pasillo);

            using (var objConn = new Persistence(false, ConnDB))
            {
                objConn.ExecuteDataTable(ref objRP);

                if (!objRP.TieneErrores)
                {
                    if (objRP.DataTable != null)
                    {
                        foreach (DataRow row in objRP.DataTable.Rows)
                        {
                            retorno.Add(new PreDistribucion(row["Periodo"].ToString(), Convert.ToInt16(row["BodegasId"]),
                                                            row["Pasillo"].ToString(),
                                                            Convert.ToInt16(row["Ubicaciones"]), row["Marca"].ToString()));
                        }
                    }
                }
                else
                    message += objRP.Errores;
            }

            objRP.Dispose();
            
            return retorno;
        }

        private int ObtenerUbicaciones()
        {
            mMensaje = "";

            return ObtenerUbicaciones(mPeriodo, mBodegasId, mNroToma, mPasillo, ref mMensaje);
        }

        private static int ObtenerUbicaciones(string Periodo, int? BodegasId, int NroToma, string Pasillo, ref string message)
        {
            string tmpPeriodo = Periodo;
            int? tmpBodegasId = BodegasId;
            string tmpPasillo = Pasillo;

            var retorno = 0;

            var objRP = new Entersoft.Data.DotNetResponse.SQL.Persistence();

            objRP.AddParametro(Periodo);
            objRP.AddParametro(BodegasId);
            objRP.AddParametro(Pasillo);

            using (var objConn = new Persistence(false, ConnDB))
            {
                var sp = "";

                if (tmpPeriodo != null && tmpBodegasId != null && tmpPasillo == null)
                    sp = string.Format("SELECT dbo.fn_GetCantidadUbicaciones('{0}', {1}, {2}, NULL)", tmpPeriodo, tmpBodegasId, NroToma);

                if (tmpPeriodo != null && tmpBodegasId != null && tmpPasillo != null)
                    sp = string.Format("SELECT dbo.fn_GetCantidadUbicaciones('{0}', {1}, {2}, '{3}')", tmpPeriodo, tmpBodegasId, NroToma, tmpPasillo);

                objConn.ExecuteScalar(ref objRP, sp);

                if (!objRP.TieneErrores)
                    retorno = Convert.ToInt32(objRP.GetScalar);
                else
                    message += objRP.Errores;
            }

            objRP.Dispose();

            return retorno;
        }

        public int Ubicaciones
        {
            get { return ObtenerUbicaciones(); }
        }
    }

    public class PreDistribucion
    {
        private string mPeriodo;
        private Bodega mBodega;
        private string mPasillo;
        private string mMarca;
        private int mUbicaciones;

        public PreDistribucion(string Periodo, int BodegasId, string Pasillo, int Ubicaciones, string Marca)
        {
            mPeriodo = Periodo;
            mBodega = Bodegas.ObtenerBodega(BodegasId);
            mPasillo = Pasillo;
            mUbicaciones = Ubicaciones;
            mMarca = Marca;
        }

        public string Periodo
        {
            get { return mPeriodo; }
            set { mPeriodo = value; }
        }

        public Bodega Bodega
        {
            get { return mBodega; }
            set { mBodega = value; }
        }

        public string Pasillo
        {
            get { return mPasillo; }
            set { mPasillo = value; }
        }

        public int Ubicaciones
        {
            get { return mUbicaciones; }
            set { mUbicaciones = value; }
        }

        public string Marca
        {
            get { return mMarca; }
            set { mMarca = value; }
        }
    }
}
